package com.ys.多线程.p1创建线程extendsThread;

/**
 * 描述:继承 Thread 来实现创建线程
 *
 * 场景：我一边吃早餐一边看报纸，此时我定义两个线程“BreakFastThread”，“BrowserNewsPaperThread”
 *  * 步骤：1 定义两个类去继承Thread
 *  *      2 覆写Thread类的run()方法，该方法定义了线程执行的任务体
 *  *      3 在run方法中循环100次，表示吃100个包子，看100条新闻
 *  *      4 创建线程对象
 *  *      5 启动线程
 *  *      目的：多线程并发执行，一边看报纸，一边吃早餐
 *  *      start()方法是Thread类的方法，所有继承了Thread的子类都可以调用该方法，此方法表示告诉CPU我的线程准备就绪了，一旦
 *  *      CPU分配时间戳那么它就会调用run()方法去执行线程里面的“任务”
 *  *      此时我定义的两个run()方法，没有主动调用而是由start()方法负责调用的。
 *
 * @author CodeYang
 * @version 2021/1/4 16:12
 */
public class p1创建线程Thread {
    // 进程 是操作系统分配和调度资源的基本单位,进程是线程的容器,一个进程可以有多个线程,每个进程都有自己独立的内存空间和编号
    // window 下 使用 tasklist 可以列出所有的进程
    // 线程是 进程的一个子任务,也可以描述为:进程与cpu之间开辟的一个执行路径
    // 进程是重量级的(有独立的内存空间,可能会很大),线程是一个轻量级应用,每个线程最多消耗128k
    // Java 中 一个线程对应一个栈,多个线程共享堆内存空间
    //栈：每个线程独有的内存区域
    //堆：多个线程共享的内存区域
    //单线程：一个进程中只有一个线程，例如“记事本”,一次只能干一件事
    //多线程:一个进程下面可以同时开启多个线程,例如：360(同时进行杀毒、内存加速等操作)
    //为什么使用多线程：让CPU和内存做最大化的利用。
    // 注意: JDK 1.5 之前 可以使用 extend Thread 和 implements Runanble 来实现创建线程
    // 并发: 同一时刻多个动作交替执行
    // 并行: 同一时刻多个动作同时执行

    // 1: 规范: extends Thread 建议只重写 run方法
    public static void main(String[] args) {

        //吃早餐线程 (任务)
        EatBreakfastTask t1 = new EatBreakfastTask();
        //看报纸线程 (任务)
        ReadNewspaperTask t2 = new ReadNewspaperTask();

        // 启动吃早餐task
        t1.start();
        // 一个线程同时启动多次会发生什么？  会报线程启动的参数异常
        // 一个线程只能调用一次start()方法启动，如果同时调用多次就会抛出java.lang.IllegalThreadStateException异常
         //t1.start();
        // 启动看报纸线程
        // 多线程就是交互的交替执行
        t2.start();
        // 特点: t2.start() -> 是父类Thread.start() 调用 实现类的run方法
        // 如果继承了 Thread 重写了 start 就无法实现多线程启动了

        //Bt 面试题:我继承了Thread 就是要重写start方法,请问怎么样还是可以保正是多线程的
        // 答: start(){
        //   super.start();
        // }

    }
}
